/*
 * @(#)Funcion.java        2.0 11/11/07
 */
 
package modelo.funciones;

import java.io.Serializable;

import modelo.MetodosNumericos.Derivar;
import modelo.MetodosNumericos.EncontrarInterseccion;
import modelo.MetodosNumericos.EncontrarMaximo;
import modelo.MetodosNumericos.EncontrarMinimo;
import modelo.MetodosNumericos.Integrar;
import modelo.abstraccionesGeometricas.*;
import modelo.excepciones.ValorNoPertenecienteAlDominio;
import modelo.operaciones.OperacionEntreFunciones;

/**
 * Esta es la clase Padre de la jerarquia de funciones matematicas. 
 * 
 * @version 	2.0 11 Nov 2007
 * @author 	 Grupo 3 Algoritmos III Cat.Fontela FIUBA
 */

public abstract class Funcion implements Serializable {
	
	
	private Integrar metodoParaIntegrar;
	private Derivar  metodoParaDerivar;
	private EncontrarInterseccion metodoParaEncontrarInterseccion;
	private EncontrarMaximo metodoParaEncontrarMaximo;
	private EncontrarMinimo metodoParaEncontrarMinimo;
	
	/**
	 * 
	 * @param valor double en el cual se quiere evaluar la funcion.
	 * @return Un double que es el resultado de evaluar la funcion en valor 
	 * @throws ValorNoPertenecienteAlDominio Arroja esta excepcion si el valor
	 * 		   pasado como parametro no pertenece al dominio de la funcion.
	 * 		   
	 */
	public abstract double evaluar(double valor) throws ValorNoPertenecienteAlDominio;
	
	public abstract Funcion aplicarOperacion(OperacionEntreFunciones op, Funcion func);
	
	public double integrar(Intervalo intervalo) {
		return this.metodoParaIntegrar.aplicar(this, intervalo);
	}
	public double calcularDerivada(Punto punto) {
		return this.metodoParaDerivar.aplicar(this, punto);
	}
	public Punto calcularInterseccion(Funcion otraFuncion, Intervalo intervalo) {
		return this.metodoParaEncontrarInterseccion.aplicar(this, otraFuncion, intervalo);
	}
	public Punto Maximo(Intervalo intervalo) {
		return this.metodoParaEncontrarMaximo.aplicar(this,intervalo);
	}
	public Punto Minimo(Intervalo intervalo) {
		return this.metodoParaEncontrarMinimo.aplicar(this, intervalo);
	}
	public void setMetodoParaIntegrar(Integrar metodoparaintegrar){
		this.metodoParaIntegrar = metodoparaintegrar;
	}
	public void setMetodoParaEncontrarInterseccion(EncontrarInterseccion metodoparainterseccion) {
		this.metodoParaEncontrarInterseccion = metodoparainterseccion;
	}		
	public void setMetodoParaDerivar(Derivar metodoparaderivar){
		this.metodoParaDerivar = metodoparaderivar;
	}
	public void setMetodoParaEncontrarMinimo(EncontrarMinimo metodoparaminimo) {
		this.metodoParaEncontrarMinimo = metodoparaminimo;
	}
	public void setMetodoParaEncontrarMaximo(EncontrarMaximo metodoparamaximo) {
		this.metodoParaEncontrarMaximo = metodoparamaximo;
	}
			
		
}	

